/**
 * @desc 要素内容高亮处理
 * @param tag_list 要素信息标签列表
 * @param checked_tag_map 选中的要素map
 * @param content 线索详情
 * @return {string}
 *
 *************************tag_list**************************
 *tag_list = [{
    label: "姓名",
    value: '',
    tags: [{
     data: ['张三'],
     checked: ''
    }]
    },{
    label: "身份证号",
    value: '',
    tags: [{
       data: ['1111111'],
       checked: ''
    }]
  }]
 ************************checked_tag_map********************
 * checked_tag_map = {
 *     '700000': '张三'
 * }
 **************************content*************************
 * content = `经核查,杨万福(男，55岁，户籍地:广东省电白县罗坑镇良田良田村
 身份证号码：440923196209125932。手机号码:15820666178、18807642366)。
 经民警深刻教育后，杨万福认识到 自已转发的言论的产重性，深刻反省,写下保证书，
 保证今后不会在任何场合发表不当言论，不愧动军退 人员集体到国家退役军人事务部反映诉求。
 责任民警:黎建能，责任单位：顺德区公安局北浩社区民警中 队，电话:13802489444。"
 经核查,杨万福(男，55岁，户籍地:广东省电白县罗坑镇良田良田村，
 身份证号码：440923196209125932。手机号码:15820666178、18807642366)。
 经民警深刻教育后，杨万福认识到 自已转发的言论的产重性，深刻反省,写下保证书，
 保证今后不会在任何场合发表不当言论，不愧动军退 人员集体到国家退役军人事务部反映诉求。
 责任民警:黎建能，责任单位：顺德区公安局北浩社区民警中 队，电话:13802489444。`
 *
 */
import _ from 'lodash'
function handleFeatureHighLight(tag_list, checked_tag_map, content) {
  console.log(tag_list, checked_tag_map, content,5656);
  let result = content;

  if (!_.isEmpty(result)) {
    tag_list.forEach(tag_item => {
      if (!_.isEmpty(tag_item['tags']) && !_.isEmpty(tag_item['tags']['data'])) {
        let checked_class = '';

        // 如果选中的要素map非空，构造黄色高亮背景
        console.log(tag_item['value'], checked_tag_map, checked_tag_map[tag_item['value']]);
        if (!_.isEmpty(checked_tag_map) && checked_tag_map[tag_item['value']]&& checked_tag_map[tag_item['value']].length) {
          checked_class = 'checked';
        }

        tag_item['tags']['data'].forEach(item => {
          let reg = new RegExp(item, "gm")
          result = result.replace(reg, `<span class='match-str ${checked_class}' data-type="${tag_item.value}">${item}</span>`);
        });
      }
    });
  }
  return result;
}

/**
 * @desc 拼接要素列表的数据结构
 * @param card_list
 * @param ys_item_formater 要素列表单行的数据格式
 * **********************card_list**************************
 * card_list = [
 *  {
 *      data: {
 *          xm: "",
            rygs: "",
            sxsjs: "",
            sfz: "",
            rylb: "",
            gzqk: "",
            ysList: [{yslx:"",ysnr:""}],
            isOpen: true
 *      }
 *  }
 * ]
 * ***********************ys_item_formater******************
 * ys_item_formater = {
    uuid: this.$tool.generateKey(), // uuid,删除时使用
    isEdit: false,
    rygs: "", //人员归属
    xm: "", // 姓名
    sfz: "", // 身份证
    hjd: "", // 户籍地
    sxsjs: "", // 涉线索角色
    ryzt: "04", // 默认04
    gzqk: "", // 工作情况(表码为'稳控措施')
    rylb: "", // 人员累呗
    gkpcs: "", // 管控派出所
    ysList: [{yslx:"",ysnr:""},{yslx:"",ysnr:""}],
    ryTag: "", // 人员标签,多个逗号隔开
    bz: "" // 备注
}
 * @return {[]}
 */
function handleYsList(card_list, ys_item_formater) {
  let result = [];

  if (!_.isEmpty(card_list)) {
    result = card_list.map(item => {
      delete item['data']['isOpen'];

      // 过滤掉空的要素类别
      if (!_.isEmpty(item['data'])) {
        return Object.assign(ys_item_formater, item['data']);
      }
    });
  }

  return result;
}

/**
 * @desc 格式化右侧某个卡片的数据
 * @param card_key_map 右侧卡片结构 如果是新增则是空结构；如果是编辑，则是卡片的数据
 * @param check_map 选中的要素map
 * @param yslx_map 要素类型map
 * *********************card_key_map***********************
 * card_key_map = {
        xm: "",
        rygs: "",
        sxsjs: "",
        sfz: "",
        rylb: "",
        gzqk: "",
        ysList: [{yslx:"",ysnr:""}]
    }
 * *********************check_map***********************
 * check_map = {
 *     '700000': ['440923196209125932']
 * }
 *  * *********************yslx_map***********************
 *  yslx_map = {
*      '700000': '姓名',
 *  }
 * @return {{}}
 */
function handleCardItem(check_map, card_key_map, yslx_map) {
  let result = JSON.parse(JSON.stringify(card_key_map));
  let name_map = { // 中英文字段map
    '姓名': 'xm',
    '身份证号': 'sfz',
  };

  if (!_.isEmpty(check_map)) {
    for (let check_key in check_map) { // check_key = '7000'
      let item = check_map[check_key]; // item = '张三'
      let key = yslx_map[check_key]; // key = '姓名'
      if (key && name_map[key]) {
        result[name_map[key]] = item; // result['xm'] = '张三'
      } else {
        // 原先右侧要素的位置
        let index_in_ys = _.findIndex(result['ysList'], ys => ys.yslx == check_key);

        if (index_in_ys != -1) {
          result['ysList'][index_in_ys]['ysnr'] = item;
        } else {
          result['ysList'].unshift({
            yslx: check_key,
            ysnr: item
          });
        }
      }
    }

    result['isOpenCard'] = true;
  }

  return result;
}

/**
 * @desc 构造选中的标签对象
 * @param tags_list
 * *************************tag_list**************************
 *tag_list = [{
    label: "姓名",
    value: '',
    tags: [{
     data: ['张三'],
     checked: ''
    }]
    },{
    label: "身份证号",
    value: '',
    tags: [{
       data: ['1111111'],
       checked: ''
    }]
  }]
 * @return {{}}
 */
function handleCheckTags(tags_list) {
  let result = {};
  if (!_.isEmpty(tags_list)) {
    for (let i = 0, len = tags_list.length; i < len; i++) {
      let item = tags_list[i];
      if (!item['tags']['checked'].length) {
        continue;
      }
      result[item['value']] = item['tags']['checked'];
    }
  }
  return result;
}

/**
 * @desc 反置要素类别map的key,value
 * @param yslb_map
 *  *  * *********************yslx_map***********************
 *  yslx_map = {
 *      '700000': '姓名',
 *  }
 * @return {{}}
 * return = {
 *     '姓名': '700000'
 * }
 */

/**
 * @MethodName: 生成随机字符串作为key
 * @param { Number } len 随机数长度
 * @return { string }
 **/
function generateKey(len = 32) {
  const $chars = "abcdefhijkmnprstwxyz2345678";
  const result = [];
  for (let i = 0; i < len; i++) {
    result.push($chars.charAt((Math.random() * 27) << 0));
  }
  return result.join("");
}

let ysContent = `经核查,杨万福(男，55岁，户籍地:广东省电白县罗坑镇良田良田村
 身份证号码：440923196209125932。手机号码:15820666178、18807642366)。
 经民警深刻教育后，杨万福认识到 自已转发的言论的产重性，深刻反省,写下保证书，
 保证今后不会在任何场合发表不当言论，不愧动军退 人员集体到国家退役军人事务部反映诉求。
 责任民警:黎建能，责任单位：顺德区公安局北浩社区民警中 队，电话:13802489444。"
 经核查,杨万福(男，55岁，户籍地:广东省电白县罗坑镇良田良田村，
 银行账号：3333333333333333。固定电话:029-111111)。
 经民警深刻教育后，杨万福认识到 自已转发的言论的产重性，深刻反省,写下保证书，
 保证今后不会在任何场合发表不当言论，不愧动军退 人员集体到国家退役军人事务部反映诉求。
 责任民警:黎建能，责任单位：顺德区公安局北浩社区民警中 队，QQ:13802489444。`;

let ysData = {
  '700000': ['440923196209125932'],
  '500000': ['15820666178'],
  '300000': ['15820666178'],
  '800100': ['13802489444'],
  '200000': ['029-111111'],
  '400000': ['3333333333333333']
};

let cardItemBase = {
  'uuid': generateKey(), // uuid,删除使用
  "xm": [],
  "rygs": "",
  "sxsjs": "",
  "sfz": [],
  "rylb": "",
  "gzqk": "",
  "ysList": [{ "yslx": "", "ysnr": [''] }],
  'hjd': "",
  'ryzt': "04",
  'gkpcs': "",
  'czcs': "",
  'ryTag': "",
  'ssqt': "",
  'qtsf': "",
  'bz': ""
};

function isIdCard(num) {
  num = num.toUpperCase();
  // 身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X。
  if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
    // alert('输入的身份证号长度不对，或者号码不符合规定！\n15位号码应全为数字，18位号码末位可以为数字或X。');
    return false;
  }
  // 校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
  // 下面分别分析出生日期和校验位
  var len, re;
  len = num.length;
  if (len == 15) {
    re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
    var arrSplit = num.match(re);

    // 检查生日日期是否正确
    var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/'
        + arrSplit[4]);
    var bGoodDay;
    bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2]))
        && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3]))
        && (dtmBirth.getDate() == Number(arrSplit[4]));
    if (!bGoodDay) {
      // alert('输入的身份证号里出生日期不对！');
      return false;
    } else {
      // 将15位身份证转成18位
      // 校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
      var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5,
          8, 4, 2);
      var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4',
          '3', '2');
      var nTemp = 0, i;
      num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
      for (i = 0; i < 17; i++) {
        nTemp += num.substr(i, 1) * arrInt[i];
      }
      num += arrCh[nTemp % 11];
      return true;
    }
  }
  if (len == 18) {
    re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
    let arrSplit = num.match(re);

    // 检查生日日期是否正确
    let dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/"
        + arrSplit[4]);
    let bGoodDay;
    bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2]))
        && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3]))
        && (dtmBirth.getDate() == Number(arrSplit[4]));
    if (!bGoodDay) {
      // alert(dtmBirth.getYear());
      // alert(arrSplit[2]);
      // alert('输入的身份证号里出生日期不对！');
      return false;
    } else {
      // 检验18位身份证的校验码是否正确。
      // 校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
      var valnum;
      let arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5,
          8, 4, 2);
      let arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4',
          '3', '2');
      let nTemp = 0, i;
      for (i = 0; i < 17; i++) {
        nTemp += num.substr(i, 1) * arrInt[i];
      }
      valnum = arrCh[nTemp % 11];
      if (valnum != num.substr(17, 1)) {
        // alert('18位身份证的校验码不正确！应该为：' + valnum);
        // alert('身份证号校验不合法');
        return false;
      }
      return true;
    }
  }
  return false;
}

const CheckIDCard = (idcode) => {
  // 加权因子
  var weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  // 校验码
  var check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

  var code = idcode + "";
  var last = idcode[17];// 最后一位

  var seventeen = code.substring(0, 17);

  // ISO 7064:1983.MOD 11-2
  // 判断最后一位校验码是否正确
  var arr = seventeen.split("");
  var len = arr.length;
  var num = 0;
  for (var i = 0; i < len; i++) {
    num = num + arr[i] * weight_factor[i];
  }

  // 获取余数
  var resisue = num % 11;
  var last_no = check_code[resisue];

  // 格式的正则
  // 正则思路
  /*
  第一位不可能是0
  第二位到第六位可以是0-9
  第七位到第十位是年份，所以七八位为19或者20
  十一位和十二位是月份，这两位是01-12之间的数值
  十三位和十四位是日期，是从01-31之间的数值
  十五，十六，十七都是数字0-9
  十八位可能是数字0-9，也可能是X
  */
  var idcard_patter = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/;

  // 判断格式是否正确
  var format = idcard_patter.test(idcode);

  // 返回验证结果，校验码和格式同时正确才算是合法的身份证号码
  return last === last_no && format ? true : false;
};
export {
  handleFeatureHighLight,
  handleYsList,
  handleCardItem,
  handleCheckTags,
  isIdCard,
  CheckIDCard,
  ysContent,
  ysData,
  cardItemBase
}
